package com.rw.tool.util.io.file.json;

import com.fasterxml.jackson.databind.introspect.BeanPropertyDefinition;
import com.rw.tool.util.io.file.exception.GetPropDBException;
import com.rw.tool.util.io.file.exception.SetPropDBException;
import com.rw.tool.util.io.file.property.PropertyVisitor;

/**
 * 属性访问器
 * 使用json来进行属性访问
 *
 * @param <T> javabean的类型
 */
public class JsonPropertyVisitor<T> implements PropertyVisitor<T> {
    private final BeanPropertyDefinition beanPropertyDefinition;

    /**
     * 声明属性访问器
     *
     * @param beanPropertyDefinition json属性
     */
    public JsonPropertyVisitor(BeanPropertyDefinition beanPropertyDefinition) {
        this.beanPropertyDefinition = beanPropertyDefinition;
    }

    /**
     * 获取属性值
     *
     * @param bean 对象
     * @return 属性值
     */
    @Override
    public Object get(T bean) {
        try {
            return beanPropertyDefinition.getGetter().callOn(bean);
        } catch (Exception e) {
            throw new GetPropDBException(e);
        }
    }

    /**
     * 设置属性值
     *
     * @param bean  对象
     * @param value 设置的属性值
     */
    @Override
    public void set(T bean, Object value) {
        try {
            beanPropertyDefinition.getSetter().callOnWith(bean, value);
        } catch (Exception e) {
            throw new SetPropDBException(e);
        }
    }
}
